#include <iostream>
#include <vector>
using namespace std;

typedef struct{
    int x;
    int y;
}Point;

int N, M;
vector<vector<int>> maze;
vector<Point> path;   // 当前路径
vector<Point> Bestpath;  // 最优路径
/*
 1. 首先将当前点加入路径，并设置为已走
 2. 判断当前点是否为出口，是则输出路径，保存结果；跳转到4
 3. 依次判断当前点的上、下、左、右四个点是否可走，如果可走则递归走该点
 4. 当前点推出路径，设置为可走
*/

// 递归走迷宫
void OutMaze( int i, int j)
{
    maze[i][j] = 1;  // 标记现场，表示已走
    path.push_back({i, j});
    
    if(i == N-1 && j == M-1)  // 如果找到出口
        if(Bestpath.empty() || Bestpath.size() > path.size())
            // 是第一条路径或当前路径为最优，更新最优路径
            Bestpath = path;
    // 向上走
    if(i - 1 >= 0 && maze[i-1][j] == 0)
        OutMaze(i-1, j);
    // 向下走
    if(i + 1 < N && maze[i+1][j] == 0)
        OutMaze(i+1, j);
    // 向左走
    if(j - 1 >= 0 && maze[i][j-1] == 0)
        OutMaze(i, j - 1);
    // 向右走
    if(j + 1 < M && maze[i][j+1] == 0)
        OutMaze(i, j+1);
    
    // 回溯
    maze[i][j] = 0;  // 恢复现场， 标记为未走
    path.pop_back(); 
}

int main()
{
    cin >> N >> M;
    maze = vector<vector<int>>(N+1, vector<int>(M+1, 1));
    path.clear();
    Bestpath.clear();
    for(int i = 0; i < N; ++i){
        for(int j = 0; j < M; ++j)
            cin >> maze[i][j];
    }
    OutMaze(0, 0);
  
    for(auto i : Bestpath){
        cout << '(' << i.x << ',' << i.y << ')' << endl;
    }
    return 0;
}